package wei.xinya.pattern.creational.singleton;

/**
 * 懒汉单例模式
 * 双重检查加锁
 */
public class DoubleCheckSingleton {

    // 使用 volatile 保证变量的可见性，可以禁止 JVM 的指令重排，保证在多线程环境下也能正常运行。
    private volatile static DoubleCheckSingleton instance;

    private DoubleCheckSingleton() {
    }

    public static DoubleCheckSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}
